
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>WeakHashMap的工作原理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>WeakHashMap的工作原理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">相较于普通的 HashMap，WeakHashMap 最核心的特点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">WeakHashMap 的核心特点是它使用弱引用（WeakReference）作为其键（key）的引用类型。这使得当一个键对象不再有任何强引用指向它时，垃圾回收器（GC）可以回收这个键对象，随后 WeakHashMap 会自动移除对应的键值对。</div>
          </div>
          <div class="card-source">来源: 文档开头部分及 1. WeakHashMap 的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">WeakHashMap 是如何得知某个键已被垃圾回收，并清理对应条目的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当一个被弱引用的键对象被垃圾回收时，JVM 会将这个键对应的 WeakReference 对象放入一个关联的引用队列（ReferenceQueue）中。WeakHashMap 在执行插入、查询或删除等操作时，会检查这个队列，从而发现哪些键已被回收，并随即删除这些键对应的键值对。</div>
          </div>
          <div class="card-source">来源: 1. WeakHashMap 的工作原理 - 清理机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 WeakHashMap 的内部数据结构中，键和值分别是以什么类型的引用存储的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在 WeakHashMap 中，键（key）被包装成一个 WeakReference（弱引用）对象进行存储，而值（value）则是以正常的强引用进行存储的。</div>
          </div>
          <div class="card-source">来源: 1. WeakHashMap 的工作原理 - 核心数据结构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">应用</div>
          <div class="card-question">WeakHashMap 主要适用于哪些应用场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">应用</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">WeakHashMap 主要适用于以下三种场景：1. 缓存场景，可以自动清理不再使用的缓存项以避免内存泄漏；2. 元数据存储，为对象附加额外信息而不影响其生命周期；3. 内存敏感型任务，用于存储不需要长期保留的数据。</div>
          </div>
          <div class="card-source">来源: 3. 应用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">使用 WeakHashMap 的一个主要优点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">其主要优点是能够自动清理。当键对象因为没有强引用而被回收后，WeakHashMap 会自动清除对应的键值对，这有助于防止内存泄漏，且无需开发者手动管理。</div>
          </div>
          <div class="card-source">来源: 4. WeakHashMap 的优缺点 - 优点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">WeakHashMap 存在什么缺点，导致它不适合所有场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">它的主要缺点是数据的不可控性。由于键的生命周期完全取决于垃圾回收器（GC）的行为，导致数据可能会在不可预知的时间被清除，因此不适合用于需要长时间或可靠保存数据的场景。</div>
          </div>
          <div class="card-source">来源: 4. WeakHashMap 的优缺点 - 缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">请解释 Java 中弱引用（Weak Reference）和强引用（Strong Reference）在垃圾回收方面的根本区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">根本区别在于它们对对象可达性的影响。强引用会阻止垃圾回收器回收被引用的对象。而弱引用则不会，一个只有弱引用指向的对象，在下一次垃圾回收发生时就会被视为可回收对象并被回收。</div>
          </div>
          <div class="card-source">来源: 2. 为什么 WeakHashMap 的键会被 GC 回收</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在 WeakHashMap 的设计中，ReferenceQueue 扮演了什么关键角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ReferenceQueue 的关键角色是作为 WeakHashMap 与垃圾回收器之间的通信机制。当垃圾回收器回收一个弱引用的键对象后，会将该键的 WeakReference 对象添加到这个队列中。WeakHashMap 通过轮询这个队列，就能得知哪些键已被回收，进而清理相应的条目。</div>
          </div>
          <div class="card-source">来源: 2. 为什么 WeakHashMap 的键会被 GC 回收 - ReferenceQueue 的作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何通过代码操作来促使 WeakHashMap 中的一个键被垃圾回收？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">要促使一个键被回收，需要移除所有指向该键对象的强引用。例如，将之前持有该键对象的变量赋值为 null。之后，可以调用 System.gc() 来建议 JVM 执行垃圾回收，从而可能回收该对象并触发 WeakHashMap 的清理机制。</div>
          </div>
          <div class="card-source">来源: 2. 为什么 WeakHashMap 的键会被 GC 回收 - 示例：如何触发键的回收</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
